from PyQt5.QtWidgets import (
    QMainWindow, QWidget, QVBoxLayout, QHBoxLayout,
    QPushButton, QLabel, QTextEdit, QLineEdit,
    QMessageBox, QProgressBar, QComboBox  
)
from PyQt5.QtCore import QTimer, pyqtSignal 

class MainWindow(QMainWindow):
    # 新增信号，用于通知类型数据加载完成
    types_loaded = pyqtSignal(list)

    def __init__(self, api_client):
        super().__init__()
        self.api_client = api_client
        self.video_types = []  # ← 新增：存储视频类型数据
        self.setup_ui()

        # 连接信号
        self.types_loaded.connect(self.populate_type_combo)

        # 初始化时加载类型数据
        self.load_video_types()
        
    def setup_ui(self):
        self.setWindowTitle("视频分析客户端")
        self.setGeometry(100, 100, 600, 480)  # ← 增大窗口高度以适应进度条
        
        # 中心部件
        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        
        # 主布局
        layout = QVBoxLayout()
        central_widget.setLayout(layout)

        # 新增：视频类型选择区域 ← 主要新增部分
        type_layout = QHBoxLayout()
        self.lbl_type = QLabel("视频类型:")
        self.cmb_type = QComboBox()  # ← 新增下拉框
        self.cmb_type.setPlaceholderText("加载中...")  # ← 初始状态
        self.cmb_type.setEnabled(False)  # ← 初始禁用

        type_layout.addWidget(self.lbl_type)
        type_layout.addWidget(self.cmb_type)
        type_layout.addStretch()  # ← 添加伸缩项使布局更美观
        
        # 视频地址输入区域
        video_url_layout = QHBoxLayout()
        
        self.lbl_url = QLabel("视频地址:")
        self.txt_url = QLineEdit()
        self.txt_url.setPlaceholderText("请输入视频URL地址")
        
        video_url_layout.addWidget(self.lbl_url)
        video_url_layout.addWidget(self.txt_url)
        
        # 控制按钮区域
        btn_layout = QHBoxLayout()
        
        self.btn_fetch = QPushButton("获取视频数据")
        self.btn_clear = QPushButton("清空")
        
        btn_layout.addWidget(self.btn_fetch)
        btn_layout.addWidget(self.btn_clear)
        
        # 新增进度条区域 ← 主要新增部分
        self.progress_bar = QProgressBar()  # ← 创建进度条
        self.progress_bar.setRange(0, 100)  # ← 设置范围
        self.progress_bar.setValue(0)       # ← 初始值
        self.progress_bar.setTextVisible(True)  # ← 显示百分比
        self.progress_bar.hide()  # ← 默认隐藏
        
        # 结果显示区域
        self.label_status = QLabel("准备就绪")
        self.text_output = QTextEdit()
        self.text_output.setReadOnly(True)
        
        # 添加到主布局（修改布局顺序）
        layout.addLayout(type_layout)
        layout.addLayout(video_url_layout)
        layout.addLayout(btn_layout)
        layout.addWidget(self.progress_bar)  # ← 添加进度条到布局
        layout.addWidget(self.label_status)
        layout.addWidget(self.text_output)
        
        # 信号槽连接
        self.btn_fetch.clicked.connect(self.handle_fetch)
        self.btn_clear.clicked.connect(self.handle_clear)
        
        # 新增：模拟进度更新定时器 ← 用于演示进度更新
        self.progress_timer = QTimer()
        self.progress_timer.timeout.connect(self.update_progress)
        self.current_progress = 0
    
    def update_progress(self):
        """更新进度条（模拟用）"""
        self.current_progress += 5
        self.progress_bar.setValue(self.current_progress)
        
        if self.current_progress >= 100:
            self.progress_timer.stop()

    def load_video_types(self):
        """从后端加载视频类型数据 ← 新增方法"""
        try:
            # 这里假设api_client有一个get_video_types方法
            types = self.api_client.get_video_types()
            self.types_loaded.emit(types)  # 发射信号
        except Exception as e:
            self.cmb_type.setPlaceholderText("加载失败")
            print(f"加载视频类型失败: {str(e)}")
    
    def populate_type_combo(self, types):
        """填充类型下拉框 ← 新增方法"""
        self.video_types = types
        self.cmb_type.clear()
        
        if not types:
            self.cmb_type.setPlaceholderText("无可用类型")
            return
            
        self.cmb_type.addItem("--请选择类型--", None)  # 默认选项
        for type_data in types:
            self.cmb_type.addItem(type_data['name'], type_data['id'])
        
        self.cmb_type.setEnabled(True)
        self.cmb_type.setPlaceholderText("")
    
    def handle_fetch(self):
        """获取视频数据分析结果（已改造）"""
        video_url = self.txt_url.text().strip()
        selected_type = self.cmb_type.currentData()
        
        if not selected_type:  # ← 新增：验证类型选择
            QMessageBox.warning(self, "警告", "请选择视频类型")
            return

        if not video_url:
            QMessageBox.warning(self, "警告", "请输入视频地址")
            return
            
        # 重置UI状态 ← 新增部分
        self.text_output.clear()
        self.label_status.setText("正在获取视频数据...")
        self.btn_fetch.setEnabled(False)
        self.btn_clear.setEnabled(False)
        
        # 显示并启动进度条 ← 新增部分
        self.progress_bar.show()
        self.current_progress = 0
        self.progress_bar.setValue(0)
        self.progress_timer.start(200)  # 每200ms更新一次进度（模拟）
        
        # 提交视频数据
        if selected_type == 1:
            QTimer.singleShot(1000, lambda: self.local_crawl_video(video_url))
        elif selected_type == 23:
            QTimer.singleShot(1000, lambda: self.local_crawl_video(video_url))
        else:
            QTimer.singleShot(2000, lambda: self.fetch_data(video_url, selected_type))  # ← 延迟2秒执行

    # ========== 新增方法：本地爬取视频 ==========
    def local_crawl_video(self, video_url):
        """本地爬取视频数据（类型1专用）"""
        try:
            # 模拟爬取进度
            for i in range(5):
                self.current_progress += 20
                self.progress_bar.setValue(self.current_progress)
                
            # 实际爬取逻辑（示例）
            video_data = {
                'title': '本地爬取的视频',
                'url': video_url,
                'source': '本地爬取',
                'video_type_id': 1,
                'local_data': True  # 新增标记表示本地数据
            }
            
            # 调用格式化显示方法
            self.show_crawl_result(video_data)
            
        except Exception as e:
            self.text_output.setPlainText(f"本地爬取失败: {str(e)}")
            self.label_status.setText("爬取失败")
        finally:
            self.btn_fetch.setEnabled(True)
            self.btn_clear.setEnabled(True)
            QTimer.singleShot(1000, self.progress_bar.hide)

     # ========== 新增方法：显示本地爬取结果 ==========
    def show_crawl_result(self, data):
        """专门显示本地爬取结果"""
        result = [
            "=== 本地爬取结果 ===",
            f"视频地址: {data['url']}",
            f"来源: {data['source']}",
            "\n提取到的视频直链:",
            f"1. {data['url']}/720p.mp4",  # 示例链接
            f"2. {data['url']}/480p.mp4"
        ]
        
        self.text_output.setPlainText("\n".join(result))
        self.label_status.setText("本地爬取完成")
    
    def fetch_data(self, video_url, video_type):
        """实际获取数据的逻辑"""
        try:
            # 调用API客户端获取数据
            data = self.api_client.fetch_video_data(video_url, video_type)
            
            # 停止进度条 ← 新增部分
            self.progress_timer.stop()
            self.progress_bar.setValue(100)
            
            # 格式化显示结果
            if data.get('error'):
                self.text_output.setPlainText(f"错误: {data['error']}")
                self.label_status.setText("请求失败")
            else:
                formatted_data = self.format_video_data(data)
                self.text_output.setPlainText(formatted_data)
                self.label_status.setText("请求完成")
                
        except Exception as e:
            self.text_output.setPlainText(f"发生错误: {str(e)}")
            self.label_status.setText("请求失败")
            
        finally:
            # 重置UI状态 ← 新增部分
            self.btn_fetch.setEnabled(True)
            self.btn_clear.setEnabled(True)
            QTimer.singleShot(1000, self.progress_bar.hide)  # 1秒后隐藏进度条
    
    def handle_clear(self):
        """清空输入和输出（已改造）"""
        self.txt_url.clear()
        self.text_output.clear()
        self.label_status.setText("准备就绪")
        self.progress_bar.hide()  # ← 新增：隐藏进度条
        self.progress_timer.stop()  # ← 新增：停止计时器
    
    def format_video_data(self, data):
        """格式化视频数据显示（保持不变）"""
        result = []
        result.append(f"视频标题: {data.get('title', '无')}")
        result.append(f"视频时长: {data.get('duration', '未知')}秒")
        result.append(f"分辨率: {data.get('resolution', '未知')}")
        # 新增：显示视频类型 ← 主要修改点
        if 'video_type_id' in data:
            type_name = next(
                (t['name'] for t in self.video_types 
                if t['id'] == data['video_type_id']),
                "未知类型"
            )
            result.append(f"视频类型: {type_name} (ID: {data['video_type_id']})")
        result.append("\n分析结果:")
        
        if 'analysis' in data:
            for key, value in data['analysis'].items():
                result.append(f"{key}: {value}")
        
        return "\n".join(result)